#define _CRT_SECURE_NO_WARNINGS 1
#include<stdio.h>
#include<string.h>
int main()
{
	char arr[200];
	char* at[50];
	char c = '\0';
	int i = 0, j = 0, ka, kb;//为起始，kb为结尾
	while (gets(arr) != NULL)
	{
		for (i = 0; i < strlen(arr); i++)
		{
			if (arr[i] != ' ')//除掉起始空格
			{
				ka = i;
				break;
			}
		}
		for (i = strlen(arr) - 1; i >= 0; i--)
		{
			if (arr[i] != ' ')//除掉尾部空格
			{
				kb = i;
				break;
			}
		}
		if (arr[i] == '?' || arr[i] == '.'||arr[i]=='!')
		{
			c = arr[i];
			kb--;
		}
		at[j++] = &arr[ka];//赋值首单词地址
		for (i = ka; i <= kb; i++)//除去边上空格后循环
		{
			if (arr[i] == ' ')
			{
				at[j++] = &arr[i + 1];
				arr[i] = '\0';
			}
		}
		arr[kb + 1] = '\0';//给最后单词的下一位赋值，以便能够结束
		for (i = j - 1; i > 0; i--)
		{
			if (*at[i] != '\0')
			{
				printf("%s ", at[i]);
			}
		}
		printf("%s", at[0]);
		if (c)
		{
			printf("%c\n", c);
		}
	}
	return 0;
}